////////////////////////////////////////////////////////////////////////////////
//
// TTS_C_API Implementation file
// C API for CTTS_Central
//
////////////////////////////////////////////////////////////////////////////////

#include "TTS_C_API.h"
#include <sys/timeb.h>
#include <math.h>
#include <time.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define STRINGLENGTH (256)
#define NUMOFFAP (68)
#define EOF (-1)
#define ERROR (-2)
#define SET (2)
#define LOCK (3)
#define INTERP (4)
#define TRUE (1)
#define FALSE (0)
#define SUCCESS (1)

int errno;

struct timeb t0;
struct timeb t1;

////////////////////////////////////////////////////////////////////////////////
// JNI init TTS
//
////////////////////////////////////////////////////////////////////////////////
JNIEXPORT void JNICALL Java_metaface_nlp_MetaFaceFestival_initialise (JNIEnv *env, jobject obj)
{
	TTS_SpeechSynthesizer = new CTTS_Central;	
}

////////////////////////////////////////////////////////////////////////////////
// JNI destroy TTS
//
////////////////////////////////////////////////////////////////////////////////
JNIEXPORT void JNICALL Java_metaface_nlp_MetaFaceFestival_destroy (JNIEnv *, jobject)
{
	delete TTS_SpeechSynthesizer;
}

////////////////////////////////////////////////////////////////////////////////
// JNI open an SML file
//
////////////////////////////////////////////////////////////////////////////////
JNIEXPORT jint JNICALL Java_metaface_nlp_MetaFaceFestival_openSMLFile (JNIEnv *env, jobject, jstring filename)
{
	jint returnint;

	const char *str = env->GetStringUTFChars(filename, 0);
	if (str == NULL)
		return (ERROR);
	
	returnint = (jint) TTS_SpeechSynthesizer->openSMLFile (str);
	env->ReleaseStringUTFChars(filename, str);
	return (returnint);
}

////////////////////////////////////////////////////////////////////////////////
// JNI close an SML file
//
////////////////////////////////////////////////////////////////////////////////
JNIEXPORT void JNICALL Java_metaface_nlp_MetaFaceFestival_closeSMLFile (JNIEnv *, jobject)
{
	TTS_SpeechSynthesizer->closeSMLFile();
}

////////////////////////////////////////////////////////////////////////////////
// JNI get next phoneme info
//
////////////////////////////////////////////////////////////////////////////////
JNIEXPORT jstring JNICALL Java_metaface_nlp_MetaFaceFestival_getNextPhonemeInfo (JNIEnv *env, jobject)
{	
	jint returnint;
	string pi;	

	returnint = (jint)TTS_SpeechSynthesizer->getPhonemeInfo (pi);

	if (returnint != SUCCESS)
		return (jstring)NULL;

	return (env->NewStringUTF(pi.c_str()));		
}

////////////////////////////////////////////////////////////////////////////////
// TTS_Initialise
//
////////////////////////////////////////////////////////////////////////////////
void TTS_Initialise ()
{
	TTS_SpeechSynthesizer = new CTTS_Central;
}

////////////////////////////////////////////////////////////////////////////////
// TTS_SpeakFromFile
//
////////////////////////////////////////////////////////////////////////////////
void TTS_SpeakFromFile (const char *Filename)
{
	assert (Filename != NULL);
	TTS_SpeechSynthesizer->SpeakFromFile (Filename);
}

////////////////////////////////////////////////////////////////////////////////
// TTS_SpeakText
//
////////////////////////////////////////////////////////////////////////////////
void TTS_SpeakText (const char *Text)
{
	assert (Text != NULL);
	TTS_SpeechSynthesizer->SpeakText (Text);
}

////////////////////////////////////////////////////////////////////////////////
// TTS_SpeakTextEx
//
////////////////////////////////////////////////////////////////////////////////
void TTS_SpeakTextEx (const char *Text, int Emotion)
{
	assert (Text != NULL);
	TTS_SpeechSynthesizer->SpeakTextEx (Text, Emotion);
}

////////////////////////////////////////////////////////////////////////////////
// TTS_Destroy
//
////////////////////////////////////////////////////////////////////////////////
void TTS_Destroy ()
{
	delete TTS_SpeechSynthesizer;
}